package com.wpp;
/*什么是Servlet?
*    servlet是javaEE规范之一，规范就是接口
*    servlet是javaweb三大组件之一。三大组件分别是：servlet、Filter、Listener
*    Servlet是 运行在服务器上的一个java小程序。它可以接收客户端发过来的请求，并响应给客户端
    servlet3：       servlet3.0支持注解开发，可以不需要web.xml，在类上使用@webServlet("/资源路径")
    GenericServlet：通过实现servlet方法需要重写大量的默认方法，比如init等，但是可以继承GenericServlet方法，在方法中，把其他方法都默认是空方法了，只把service方法抽象了
    HttpServlet :   对http协议的一种封装，简化操作
*servlet的生命周期？
*   1.执行servlet构造器方法
*   2.执行init初始化方法
*   3.执行servlet中service方法
*   4.执行销毁方法(destroy)
*
*HTTP:超文本传输协议
*   定义了客户端和服务器通信时，发送数据的格式
*   特点：
*       1.基于TCP/IP的高级协议
*       2.默认端口号：80
*       3.基于请求/响应模型的：一次请求对应一次响应
*       4.无状态的：每次请求之间相互独立，不能交互数据
*   历史版本：
*       1.0     每次响应都会建立新的连接
*       1.1     复用连接
*   请求消息的数据格式：
*       1.请求行
*
*request&response对象的原理：由服务器创建的
*   1.tomcat服务器会根据请求url中的资源路径，创建对应的对象
*   2.tomcat服务器，会创建request和response对象，request对象中封装了请求消息数据
*   3.tomcat将requset和response两个对象传递给service方法，并且调用service方法
*   4.我们可以通过request对象获取请求消息数据，通过response对象设置响应消息数据
*   5.服务器在给浏览器做出响应之前，会从response对象中拿出程序员设置的响应消息数据
*
*通过获取请求头得到浏览器的版本，解决兼容问题
*
* 其他功能：
*   获取请求参数通用方式：不管是get还是post请求，都可以用以下几种方法
*      String getParamaeter(String name);根据参数名称获取参数值    比如传入username 返回的就是name
*      String[] getParamaeterValues(String name);根据参数名称获取参数值的数组    比如传入hobby 返回的就是几个具体的值，多用于复选框
*      String[] getParamaeterNames();获取所有请求参数的名称
*      Map<String,String[]> getParamaeterMap();获取所有参数的键值对的map集合
*
*      中文乱码问题：
*           get方式：中文参数不会乱码
*           post方式：中文会乱码    解决办法：设置流的编码 request.setCharacterEncoding("UTF-8");
*
*
*  请求转发：资源跳转的一种方式
*      特点：1.浏览器地址不发生改变
*           2.只能转发到当前服务器内部资源中
*           3.转发是一次请求，可以使用request对象来共享数据
*          request.getRequestDispatcher("/demo9").forward(request,response);
*
*  重定向：
*       1.resp.setStatus(302);设置状态码
*       2.resp.setHeader("location","/day15/demo1");设置响应头location
*      简单的重定向方式：
*           resp.sendRedirect("/day15/demo1");
*   重定向的特点：
*           地址栏发生变化
*           重定向可以访问其他服务器的资源
*           重定向是两次请求,不可以使用request对象来共享数据
*
*    动态获取虚拟目录，常用于重定向地址拼接
*         String contextPath = request.getContextPath();
*         resp.sendRedirect(contextPath + "/demo1");
*
*
*
*
*
*  共享数据：
*       域对象：一个有作用范围内的对象，可以在范围内共享数据
*       request域：代表一次请求的范围，一般用于请求转发的多个资源中共享数据
*       方法：
*           1.setAttribute(String name,object obj);存储数据，用于一次转发中共享数据
*           2.getAttribute(String name);通过键获取数据
*           3.removeAttribute(String name);通过键移除键值对
*
*   两个输出流：
*       resp.getWriter();
*       resp.getOutputStream();
*
*       //告诉浏览器，服务器发送的消息体数据的编码，建议浏览器使用该编码解码。
*       resp.setHeader("content-type","text/html;charset=utf-8");
*       //给客户端回传数据
*       resp.getWriter().write("登录失败");
*
*   ServletContext():共享所有请求所有用户的数据
*
*会话技术：
*       1.会话：一次会话中包含多洗请求多次响应
*       2.功能：在一次会话的范围内的多次请求间，共享数据
*       3.方式：
*           客户端会话技术：Cookie
*           服务端会话技术：Session
*   ****Cookie:cookie由客户端设置并发送
*     实现原理：
*           客户端向服务器端发送请求，服务器向客户端响应请求，并且在响应头中设置set-cookie,
*           第二次客户端向向服务器端发送请求。请求头中就包含了服务器端发送的cookie
*   cookie的细节：
*       1.一次可不可以发送多个cookie?
*           可以。
*           可以创建多个cookie对象，使用request调用多次addcookie方法发送cookie即可
*            获取cookie:request.getCookies().然后遍历cookie.cookie.getName();返回键的名称
*       2.cookie在浏览器中保持多长时间？
*           1.默认情况下，当浏览器关闭后，cookie数据被销毁
*           2.持久化存储：
*               setMaxAge(int seconds);
*                   1.正数:将cookie数据写到硬盘的文件中，持久化存储，cookie存活时间，到时间自动删除
*                   2.负数：默认值
*                   3.零：删除cookie信息
*       3.cookie能否存中文？
*           在tomcat8之前 cookie不能直接存储中文数据
*           在tomcat8之后，cookie能正常存储中文数据
*       4.cookie获取范围多大？
*           默认情况下，在本项目中有效
*           可以设置虚拟目录setPath("/");这样就能够共享cookie数据了
*
*           不同的tomcat服务器间cookie共享问题？
*              setDomain(String path):如果设置壹基金域名相同，那么多个服务器之间cookie可以共享
*       5.cookie的特点和作用：
*           1.cookie存储数据在客户端浏览器
*           2.浏览器对于单个cookie的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
*
*    session:
*       1概念：服务器端会话技术，在一次会话的多次请求间共享数据，将数据保存在服务器端的对象中，HttpSession
*       2.方法
*           获取session对象：request.getSession
*           判断当前对象是否是新创建的session：session.isNew();
*           获取session会话的唯一id值：session.getId();
*           使用session对象 ：object getAttribute(String name);
*                           void  setAttribute(String name,object value);
*                           void  removeAttribute(String name);
*       原理：session的实现是依赖于cookie的
*
*       细节：
*           当客户端关闭后，服务器不关闭，两次获取的session是否为同一个？
*               不是同一个，通过设置cookie的存活时间，让session的存活时间变长，session的实现是依赖于cookie的，创建cookie，键为JSESSIONID,每次请求，都会把session的id以cookie的形式发给浏览器，设置最大存活时间，让cookie持久化保存
*           客户端不关闭，服务器关闭后，两次获取的session是同一个吗？
*               不是同一个，但是要确保数据不会丢失
*                   session的钝化：
*                       在服务器正常关闭之前，将session对象序列化到硬盘上
*                   session的活化：
*                       在服务器启动之后，将session文件转为内存中的session对象即可
*                   注意：在正常关闭的情况下，tomcat服务器帮我们完成了钝化和活化的事儿，idea只能完成钝化，不能完成活化
*
*       session什么时候被销毁？
*           1.服务器被关闭
*           2.session对象调用invalidate方法
*           3.session默认失效时间是30分钟，不过可以修改配置文件来设置存活时间
*
*
*        session的特点：
*           服务器端会话技术，在一次会话的多次请求间共享数据，将数据保存在服务器端
*           session可以存储任意类型，任意大小的数据
*
*   session和cookie的区别：
*       1.session存储数据在服务器端，cookie在客户端
*       2.session没有数据大小限制，cookie有(4kb)
*       3.session数据安全(因为存储在服务器端),cookie相对于不安全
*
*
*   Filter:
*       web中的过滤器：当访问服务器的资源时，过滤器可以将请求拦截下来，完成一些特殊的功能
*       过滤器的作用：
*           一般用于完成通过的操作，如：登录验证，统一编码处理，敏感字过滤
*
*     步骤:
*         1.定义一个类，实现接口Filter
*         2.复写方法
*         3.配置拦截的路径(两种方式):
*           1.web.xml配置
*           2.注解(@WebFilter)
*
*      拦截器配置详解：
*       1.拦截路径配置: /index.jsp  只有访问index.jsp资源时，过滤器才会被执行
*       2.目录拦截： /user/* 访问/user下的所有资源时，过滤器都会被执行
*       3.后缀名拦截:    *.jsp   访问所有后缀名为.jsp资源时，过滤器都会被执行
*       4.拦截所有资源    /*  访问所有资源时，过滤器都会被执行
*
*      拦截方式配置：资源被访问的方式
*           注解配置:
*               设置dispatcherTypes属性
*                   1.REQUEST:默认值。浏览器直接请求资源
*                   2.FORWARD:转发访问资源
*                   3.INCLUDE:包含访问资源
*                   4.ERROR:错误跳转资源
*                   5.ASYNC:异步访问资源
*           web.xml:
*               设置<dispatcher>标签
*
*       过滤器先后执行顺序问题
*           1.注解配置：按照   类名   的字符串比较规则比较。值小的先执行
*               如：Afilter   和   Bfilter     A小，所以Afilter就先执行了
*           2.配置文件：谁定义在上面，谁先执行。
*
*
* */

import javax.servlet.*;
import java.io.IOException;

////手动实现servlet方法
//public class ServletTest_1 implements Servlet{
//    @Override
//    public void init(ServletConfig servletConfig) throws ServletException {
//
//    }
//
//    @Override
//    public ServletConfig getServletConfig() {
//        return null;
//    }
//
//
//    /*
//    * 专门处理请求和响应的
//    *
//    * */
//    @Override
//    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//        System.out.println("请求和响应");
//        servletRequest.getRequestDispatcher("index.jsp").forward(servletRequest,servletResponse);
//    }
//
//    @Override
//    public String getServletInfo() {
//        return null;
//    }
//
//    @Override
//    public void destroy() {
//
//    }
//}
